Keyword: KMM shared module, Expect/Actual
今天我們來看看範例專案內容,先切換到Project顯示,展示整個專案的內容.
KMM可以跨平台運行的魔法,就藏在shared的模組中.
shared正如其名,是負責共用的部分的區塊,而其中的commonMain資料夾更是用來存放雙平台均通用的部分,讓我們點開commonMain的資料夾
可以看到有兩個物件,Greeting與Platform.先打開Greeting物件,可以看到下面的程式碼.
class Greeting {
fun greeting(): String {
return "Hello, ${Platform().platform}!"
}
}
內容很簡單,就有一個方法,內容是呼叫Platform並且回傳一串字串.我們再點開Platform看看其中的內容.
expect class Platform() {
val platform: String
}
也是很簡單的,但是有一個不大熟悉的關鍵字出現"expect",並且旁邊還有一個特別的符號在.像是一個”A“
點了下去會有兩個選項可以選擇,還都叫Platform,只是其中一個看路徑...好像在iosMain內?隨便選一個會發生跳轉,這次符號變成了一個"E"
眼尖的人剛剛應該已經注意到在class前面已經分別有Expect與Actual的關鍵字了.
原來,這個是KMM提供給各平台分別實做的關鍵字.
由Expect關鍵字定義這個物件提供怎樣的屬性與方法.
以這個範例來說就是提供一個字串
而兩個以Actual標記的物件,則是各平台對於這個Expect的實作.
可以看到Android的是
actual class Platform actual constructor() {
actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}
並且放在androidMain的package下
而iOS則是
actual class Platform actual constructor() {
actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}
放在iosMain的package下
而最後上層的畫面,能直接使用的,只有sharedMain的內容.
可以看看androidApp內的MainActivity,是負責顯示的VIew層,在KMM的架構中,顯示的View層是由各平台自行實作的.
Android當然是直接使用Kotlin撰寫
...
import com.officeyuli.myapplicationkmm.Greeting
...
fun greet(): String {
return Greeting().greeting()
}
...
而iOS的View層,則是由iOS的原生語言Swift撰寫
...
import shared
...
struct ContentView: View {
let greet = Greeting().greeting()
var body: some View {
Text(greet)
}
}
暸解了KMM如何共用後,明天我們開始修改這個專案,讓內容更加豐富